package com.tgy.MyFlowable.workflow.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ctsi.workflow.dto.FlwDefinitionDTO;
import com.ctsi.workflow.dto.FlwUserTaskVO;
import com.ctsi.workflow.vo.FlwDefinitionVO;
import com.fasterxml.jackson.databind.JsonNode;
import org.flowable.engine.repository.ProcessDefinition;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 流程定义业务接口
 *
 * @version 1.0
 * @author: wang xiao xiang
 * @date: 2021/8/6 16:28
 */
public interface IFlwDefinitionService {
    /**
     * 查询流程定义
     *
     * @param flwDefinitionDTO 查询参数
     */
    Page<FlwDefinitionVO> page(FlwDefinitionDTO flwDefinitionDTO);

    /**
     * 部署流程
     *
     * @param flwDefinitionDTO 部署请求参数
     */
    void deploy(FlwDefinitionDTO flwDefinitionDTO);

    /**
     * 流程定义的流程图
     *
     * @param flwDefinitionDTO 　流程定义参
     * @return 流程图数据
     */
    JsonNode trace(FlwDefinitionDTO flwDefinitionDTO);

    /**
     * 根据流程ID获取流程定义
     *
     * @param id 流程ID
     * @return 流程定义对象
     */
    ProcessDefinition queryProcessDefinition(String id);

    /**
     * 根据流程定义id获取流程定义详情
     *
     * @param id 流程定义ID
     * @return 流程定义结果
     */
    FlwDefinitionVO detail(String id);

    /**
     * 导出流程文件
     *
     * @param flwDefinitionDTO 导出参数
     * @param response         响应response
     */
    void export(FlwDefinitionDTO flwDefinitionDTO, HttpServletResponse response);

    /**
     * 激活/挂起流程定义
     *
     * @param flwDefinitionDTO 流程定义参数
     * @param isSuspend        是否挂起，true挂起，false激活
     */
    void activeOrSuspend(FlwDefinitionDTO flwDefinitionDTO, boolean isSuspend);

    /**
     * 映射流程定义，将已部署的流程映射到模型
     *
     * @param flwDefinitionDTO 流程定义参数
     */
    void mapping(FlwDefinitionDTO flwDefinitionDTO);

    /**
     * 流程定义的用户任务节点，用于跳转时选择节点
     *
     * @param flwDefinitionDTO 流程定义参数
     * @return 用户任务节点集合
     */
    List<FlwUserTaskVO> userTask(FlwDefinitionDTO flwDefinitionDTO);

    /**
     * 删除流程定义，根据版本删除，级联删除流程实例和相关任务
     *
     * @param flwDefinitionDTO
     */
    void delete(FlwDefinitionDTO flwDefinitionDTO);

    /**
     * 根据流程id获取流程定义并校验状态
     *
     * @param processDefinitionId 流程定义id
     * @return 流程定义结果
     */
    ProcessDefinition queryProcessDefinitionWithValidStatus(String processDefinitionId);

    /**
     * 多实例用户任务节点的元素变量名
     *
     * @param processDefinitionId 流程定义id
     * @param currentActId        节点id
     * @return 元素变量名
     */
    String getMultiInstanceActAssigneeParam(String processDefinitionId, String currentActId);
}
